#include "hrac.h"

Hrac::Hrac()
{
    jmeno = new QString();
    barva = new QColor();
    znak = new quint16;
    body = new quint16;
    tahy = new QVector<Tah>();
    grafika = new QPainterPath();
    typ = new TypHrace;
}

Hrac::Hrac(const Hrac &other)
{
    jmeno = new QString(*other.jmeno);
    barva = new QColor(*other.barva);
    znak = new quint16(*other.znak);
    body = new quint16(*other.body);
    tahy = new QVector<Tah>(*other.tahy);
    grafika = new QPainterPath(*other.grafika);
    typ = new TypHrace(*other.typ);
}

Hrac::Hrac(QDataStream &in)
    : jmeno(new QString())
    , barva (new QColor())
    , znak (new quint16(0))
    , body (new quint16(0))
{
    this->unserialize(in);
}
Hrac::~Hrac()
{
    delete jmeno;
    delete barva;
    delete znak;
    delete body;
    delete grafika;
    delete typ;
}

void Hrac::nastavVlastnosti(QString jmeno, QColor barva, quint16 znak, quint16 body, TypHrace typ)
{
    *this->jmeno = jmeno;
    *this->barva = barva;
    *this->znak = znak;
    *this->body = body;
    *this->typ = typ;
}

void Hrac::pridejTah(quint16 x, quint16 y)
{
    tahy->append(Tah(x,y));
}

quint16 * Hrac::zjistiZnak()
{
    return znak;
}

QColor * Hrac::zjistiBarvu()
{
    return barva;
}

QPainterPath * Hrac::zjistiGrafiku()
{
    return grafika;
}

QString * Hrac::zjistiJmeno()
{
    return jmeno;
}

QVector<Tah> * Hrac::zjistiTahy()
{
    return tahy;
}

TypHrace * Hrac::zjistiTyp()
{
    return typ;
}

quint16 * Hrac::zjistiBody()
{
    return body;
}

bool Hrac::existujeTah(quint16 x, quint16 y)
{
    return tahy->contains(Tah(x,y));
}

bool Hrac::checkForVictory()
{
    quint16 temp = 0;
    /* step uchovává zvětšování x a y pro všechny 4 směry */
    qint16 step[] = {0,1,1,1,1,0,1,-1};

    //pro každý směr se provede kontrola, jestli není 5 značek za sebou
    for(quint16 i = 0; i < 4; i++)
    {
        //začíná se 4 políčka před políčkem, okolo kterého se kontrolují značky
        quint16 startx = *tahy->last().getX() - 4*step[i*2];
        quint16 starty = *tahy->last().getY() - 4*step[i*2+1];
        //hledání pětice 4 políčka před a za aktuálním
        for(quint16 j = 0; j < 9; j++)
        {
            temp += tahy->contains(Tah(startx+step[i*2]*j,starty+step[i*2+1]*j))?1:-temp;
            if(temp==5) return true;
        }
    }
    return false;
}

void Hrac::serialize(QDataStream &ost)
{
    ost << *this->jmeno << *this->barva << *this->znak << *this->body;
}

void Hrac::unserialize(QDataStream &str)
{
    str >> *this->jmeno >> *this->barva >> *this->znak >> *this->body;
}


QDataStream& Hrac::operator<<(QDataStream &in)
{
    this->serialize(in);
    return in;
}

QDataStream& Hrac::operator>>(QDataStream &str)
{
    this->unserialize(str);
    return str;
}
